import EventProducer from "../event/eventProduct.js";
import BaseObject from "./baseObject.js";

/**
 * @description 基础模型
 * @class {BaseModel}
 * @extends {BaseObject} 基础对象模型
 * @author hhx
 * @date 2024-12-1 15:12
 * @version 0.1.2
 */
class BaseModel extends BaseObject {

    /**
     * @description 事件生产者
     * @private
     * @type {EventProducer}
     */
    _eventProducer = null;

    /**
     * @description 模型管理器
     * @private
     * @type {BaseManager}
     */
    _manager = null;

    /**
     * @description 事件生产者
     * @constructor
     * @param {object} props 配置对象
     */
    constructor(props) {
        super(props);
    }


    //=================================== 成员定义 =======================================

    /**
     * @description 获取 事件生产者
     * @member
     * @protected
     * @returns {EventProducer} 事件生产者
     */
    get eventProducer() {
        return this._eventProducer;
    }

    /**
     * @description 设置 事件生产者
     * @member
     * @protected
     * @param {EventProducer} value 事件生产者
     */
    set eventProducer(value) {
        this._eventProducer = value;
    }

    /**
     * @description 获取 基础管理器
     * @member
     * @protected
     * @returns {BaseManager} 基础管理器
     */
    get manager() {
        return this._manager;
    }

    /**
     * @description 设置 基础管理器
     * @member
     * @protected
     * @param value {BaseManager} 基础管理器
     */
    set manager(value) {
        this._manager = value;
    }

    //=================================== 成员方法 =======================================

    /**
     * @description 获取 事件生产者
     * @public
     * @returns {EventProducer} 事件生产者
     */
    getEventProducer() {
        return this.eventProducer;
    }

    /**
     * @description 设置 事件生产者
     * @public
     * @param value {EventProducer|*} 事件生产者
     */
    setEventProducer(value) {
        this.eventProducer = value;
    }

    /**
     * @description 是否存在 事件生产者
     * @public
     * @returns {boolean} true 是 false 否
     */
    hasEventProducer() {
        return this.isNotNull(this.eventProducer);
    }

    /**
     * @description 获取基础管理器
     * @public
     * @return {BaseManager} 基础管理器
     */
    getManager() {
        return this.manager;
    }

    /**
     * @description 设置基础管理器
     * @public
     * @param value {BaseManager} 基础管理器
     */
    setManager(value) {
        this.manager = value;
    }

    /**
     * @description 是否存在基础管理器
     * @public
     * @return {Boolean} true 是 false 否
     */
    hasManager() {
        return this.isNotNull(this.manager);
    }

    //=================================== 属性定义 =======================================

    /**
     * @description 获取 显示值 属性
     * @property
     * @protected
     * @default ''
     * @returns {string|number|boolean|*} 显示值
     */
    get value() {
        return this.getPropValue('value');
    }

    /**
     * 设置 显示值 属性
     * @property
     * @protected
     * @default ''
     * @param value {string|number|boolean|*} 显示值
     */
    set value(value) {
        this.setPropValue('value', value);
    }

    //=================================== 属性方法 =======================================

    //=================================== 构造方法 =======================================

    /**
     * @description 初始化
     * @protected
     */
    init(props) {

        super.init(props);

        // 构建 事件生产者
        this.buildEventProducer();

    }

    /**
     * @description 构建 事件生产者
     * @protected
     */
    buildEventProducer() {

        const eventProducer = this.createEventProducer();

        this.setEventProducer(eventProducer);

    }

    //=================================== 创建方法 =======================================

    /**
     * @description 创建 事件生产者
     * @protected
     * @returns {EventProducer} 事件生产者
     */
    createEventProducer(props = {}) {
        return EventProducer.instance(props);
    }

    //=================================== 内部方法 =======================================

    //=================================== 事件订阅 =======================================


    //=================================== 事件处理 =======================================

}

export default BaseModel;